import { Injectable, inject } from '@angular/core';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { MatDialog, MatDialogConfig } from '@angular/material/dialog';
import { TranslateService } from '@ngx-translate/core';
import { AuthService } from '@core/auth/auth.service';

import { 
  ConfirmDialogComponent, 
  ConfirmDialogData 
} from '@shared/components/dialog/confirm-dialog.component';
import { 
  AlertDialogComponent, 
  AlertDialogData 
} from '@shared/components/dialog/alert-dialog.component';
import {
  ErrorAlertDialogComponent,
  ErrorAlertDialogData
} from '@shared/components/dialog/error-alert-dialog.component';

/**
 * 对话框服务，提供统一的对话框操作接口，包括确认、提示、错误提示等功能
 */
@Injectable({
  providedIn: 'root'
})
export class DialogService {
  private readonly translate = inject(TranslateService);
  private readonly authService = inject(AuthService);
  public readonly dialog = inject(MatDialog);

  /**
   * 创建符合 MDC 规范的对话框配置
   * 
   * @param fullscreen - 是否全屏显示
   * @returns MatDialogConfig 配置对象
   */
  private createDialogConfig(fullscreen: boolean = false): MatDialogConfig {
    const config: MatDialogConfig = {
      // 禁用点击外部关闭，确保用户必须做出选择
      disableClose: true,
      // 恢复焦点到触发元素
      restoreFocus: true,
      // 自动焦点管理
      autoFocus: false,
      // 进入动画时长（MDC 标准：150ms）
      enterAnimationDuration: '150ms',
      // 退出动画时长（MDC 标准：100ms）
      exitAnimationDuration: '100ms',
    };

    if (fullscreen) {
      // 全屏模式配置
      config.width = '100vw';
      config.height = '100vh';
      config.maxWidth = '100vw';
      config.maxHeight = '100vh';
      config.panelClass = ['cne-fullscreen-dialog'];
    } else {
      // 标准模式：最大宽度 560px（MDC 对话框标准宽度）
      config.maxWidth = '560px';
    }

    return config;
  }

  // 构造函数保留为空，避免与属性注入混用
  constructor() {}

  /**
   * 显示确认对话框
   * 
   * @param title - 对话框标题
   * @param message - 确认消息内容
   * @param cancel - 取消按钮文本（默认使用翻译）
   * @param ok - 确认按钮文本（默认使用翻译）
   * @param fullscreen - 是否全屏显示
   * @returns Observable<boolean> - true 表示确认，false 表示取消
   */
  confirm(title: string, message: string, cancel: string | null = null, ok: string | null = null, fullscreen: boolean = false): Observable<boolean> {
    const dialogConfig: MatDialogConfig<ConfirmDialogData> = {
      ...this.createDialogConfig(fullscreen),
      data: {
        title,
        message,
        cancel: cancel || this.translate.instant('action.cancel'),
        ok: ok || this.translate.instant('action.ok')
      }
    };
    const dialogRef = this.dialog.open<ConfirmDialogComponent, ConfirmDialogData, boolean>(ConfirmDialogComponent, dialogConfig);
    return dialogRef.afterClosed().pipe(
      map((result): boolean => result ?? false)
    );
  }

  /**
   * 显示提示对话框
   * 
   * @param title - 对话框标题
   * @param message - 提示消息内容
   * @param ok - 确定按钮文本（默认使用翻译）
   * @param fullscreen - 是否全屏显示
   * @returns Observable<boolean> - true 表示用户确认
   */
  alert(title: string, message: string, ok: string | null = null, fullscreen: boolean = false): Observable<boolean> {
    const dialogConfig: MatDialogConfig<AlertDialogData> = {
      ...this.createDialogConfig(fullscreen),
      data: {
        title,
        message,
        ok: ok || this.translate.instant('action.ok')
      }
    };
    const dialogRef = this.dialog.open<AlertDialogComponent, AlertDialogData, boolean>(AlertDialogComponent, dialogConfig);
    return dialogRef.afterClosed().pipe(
      map((result): boolean => result ?? false)
    );
  }

  /**
   * 显示错误提示对话框
   * 
   * @param title - 对话框标题
   * @param message - 错误提示消息
   * @param error - 错误对象
   * @param ok - 确定按钮文本（默认使用翻译）
   * @param fullscreen - 是否全屏显示
   * @returns Observable<boolean> - true 表示用户确认
   */
  errorAlert(title: string, message: string, error: any, ok: string | null = null, fullscreen: boolean = false): Observable<boolean> {
    const dialogConfig: MatDialogConfig<ErrorAlertDialogData> = {
      ...this.createDialogConfig(fullscreen),
      data: {
        title,
        message,
        error,
        ok: ok || this.translate.instant('action.ok')
      }
    };
    const dialogRef = this.dialog.open<ErrorAlertDialogComponent, ErrorAlertDialogData, boolean>(ErrorAlertDialogComponent, dialogConfig);
    return dialogRef.afterClosed().pipe(
      map((result): boolean => result ?? false)
    );
  }


  /**
   * 显示权限被拒绝提示
   */
   permissionDenied() {
    this.alert(
      this.translate.instant('access.permission-denied'),
      this.translate.instant('access.permission-denied-text'),
      this.translate.instant('action.close')
    );
  }

  /**
   * 显示访问被禁止对话框
   * 
   * 当用户访问被禁止的资源时，显示全屏确认对话框。
   * 如果用户点击"登录"，将执行登出操作并返回登录页。
   * 
   * @returns Observable<boolean> - true 表示用户选择重新登录
   */
  forbidden(): Observable<boolean> {
    const observable = this.confirm(
      this.translate.instant('access.access-forbidden'),
      this.translate.instant('access.access-forbidden-text'),
      this.translate.instant('action.cancel'),
      this.translate.instant('action.sign-in'),
      true
    );
    observable.subscribe((res) => {
      if (res) {
        this.authService.logout();
      }
    });
    return observable;
  }
}